package cn.kgc.util;

import cn.kgc.entity.Menus;
import cn.kgc.entity.Users;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author YC
 */
public class SystemUtil {

    /**
     * 从SpringSecurity中的SecurityContextHolder中获取当前登录的用户信息
     */
    public static Users getLoginUser() {
        SecurityContext context = SecurityContextHolder.getContext();
        return (Users) context.getAuthentication().getPrincipal();
    }

    /**
     * 递归生成树形结构
     *
     * @param menus 菜单集合
     * @return 树形结构集合
     */
    public static List<Menus> tree(List<Menus> menus) {
        return menus.stream()
                // 过滤到根节点
                .filter(menu -> menu.getParentId() == -1)
                .peek(parent -> findChildren(menus, parent))
                .collect(Collectors.toList());
    }

    /**
     * 递归查找子节点
     *
     * @param menus 菜单集合
     * @param menu  父节点
     */
    private static void findChildren(List<Menus> menus, Menus menu) {
        menus.forEach(temp -> {
            // 如果当前节点的父节点id等于当前节点的id，则说明当前节点是当前节点的子节点
            if (temp.getParentId().equals(menu.getId())) {
                menu.getChildren().add(temp);
                // 递归查询子菜单下是否还有孙子菜单
                findChildren(menus, temp);
            }
        });
    }

}
